/** 
* @file        demo_onenet.c
* @ingroup     cloud
* @brief       使用API实现Onenet与网络云平台交互的参考代码,demo完成注册和消息处理，发包操作需要新创建线程操作。
* @attention  
* @note 
*/

/**
 * @defgroup cloud Cloud
 */

#include "zos_config.h"


#ifdef BOARD_USING_CMIOT

#include "zos.h"
#include "cmiot.h"

//定义onenet stream

cmiot_stream_t on_object;
cmiot_stream_t timer_object;
cmiot_stream_t color_object;
cmiot_stream_t power_object;

cmiot_stream_t cur_object;
cmiot_stream_t sum_object;

zos_bool_t value_bool = TRUE;
int value_int = 25;
float value_float = 0.0;
zos_uint8_t value_string[100] = "xytest";

/****************************************************
* 函数名称： cmiot_close_callback
*
* 函数作用： onenet平台强制断开连接回调函数
*
* 入口参数： 无
*
* 返回值： 0 处理成功	1 处理失败
*****************************************************/
zos_err_t cmiot_close_callback(void)
{
	zos_printf("enter close onenent callback\r\n");
	return ZOS_EOK;
}

/****************************************************
* 函数名称： cmiot_observer_notify_rsp_callback
*
* 函数作用： onenet平台初次登录读取本地信息
*
* 入口参数： msgid：消息ID	insid：instance id	resid: resource id
*
* 返回值： 0 处理成功	1 处理失败
*****************************************************/
zos_err_t cmiot_observer_notify_rsp_callback(int msgid,int index,int flag)
{
	zos_printf("enter observer rsp callback\r\n");
	//判断是否为读取温度值
	if(cmiot_get_observe_notify(on_object)==ZOS_EOK)
	{
		cmiot_notify(cur_object,4,(cmiot_value_t)&value_float,index,flag);
	}
	else if(cmiot_get_observe_notify(sum_object)==ZOS_EOK)
	{
		cmiot_notify(sum_object,4,(cmiot_value_t)&value_float,index,flag);
	}

	return ZOS_EOK;
}

/****************************************************
* 函数名称： cmiot_read_rsp_callback
*
* 函数作用： onenet平台 read操作回调函数
*
* 入口参数： msgid：消息ID	insid：instance id	resid: resource id
*
* 返回值： 0 处理成功	1 处理失败
*****************************************************/
zos_err_t cmiot_read_rsp_callback(int msgid,int insid,int resid)
{
	zos_printf("enter read dsp callback\r\n");
	//判断是否为读取温度值
	if(cmiot_get_object_read(on_object)==ZOS_EOK)
	{
		cmiot_read_rsp(msgid,cmiot_state_result_read_success,on_object,1,(cmiot_value_t)&value_bool,0,0);
	}
	//判断是否为读取湿度值
	else if(cmiot_get_object_read(timer_object)==ZOS_EOK)
	{
		cmiot_read_rsp(msgid,cmiot_state_result_read_success,cur_object,4,(cmiot_value_t)&value_float,0,0);
	}
		//判断是否为读取led2 状态
	else if(cmiot_get_object_read(sum_object)==ZOS_EOK)
	{
		cmiot_read_rsp(msgid,cmiot_state_result_read_success,sum_object,4,(cmiot_value_t)&value_float,0,0);
	}

	return ZOS_EOK;
}
/****************************************************
* 函数名称： cmiot_write_rsp_callback
*
* 函数作用： onenet平台 write操作回调函数
*
* 入口参数： len:	需要写入的数据长度
*
*						 value:	需要写入的数据内容
*
* 返回值： 0 处理成功	1 处理失败
*****************************************************/
zos_err_t cmiot_write_rsp_callback(int len,char* value)
{
	zos_printf("enter write dsp callback\r\n");	
	//判断是否为读取温度值
	if(cmiot_get_object_write(on_object)==ZOS_EOK)
	{
		zos_printf("data = %d\r\n",value[0]);
	}
	//判断是否为读取湿度值
	else if(cmiot_get_object_write(timer_object)==ZOS_EOK)
	{
		zos_printf("data = %d\r\n",value[0]);
	}
	//判断是否为读取led0 状态
	else if(cmiot_get_object_write(color_object)==ZOS_EOK)
	{
		zos_printf("data = %s\r\n",value);
	}
	//判断是否为读取led2 状态
	else if(cmiot_get_object_write(power_object)==ZOS_EOK)
	{
		zos_printf("data = %f\r\n",value[0]);
	}

	return ZOS_EOK;
}
/****************************************************
* 函数名称： cmiot_exec_rsp_callback
*
* 函数作用： onenet平台 exec操作回调函数
*
* 入口参数： len:	平台exec命令下发数据长度
*
*						 cmd:	平台exec命令下发数据内容
*
* 返回值： 0 处理成功	1 处理失败
*****************************************************/
zos_err_t cmiot_exec_rsp_callback(int len,char* cmd)
{
	zos_printf("enter exec dsp callback\r\n");

	return ZOS_EOK;
}



int demo_onenet(void)
{
	cmiot_init_environment();
	// on_object=cmiot_object_init(3311,0,5850,1,"1",3,0,cmiot_value_bool);
	// if(on_object==ZOS_NULL)
	// {
	// 	zos_printf("on_object create failure\r\n");
	// }
	// timer_object=cmiot_object_init(3311,0,5851,1,"1",3,0,cmiot_value_integer);
	// if(timer_object==ZOS_NULL)
	// {
	// 	zos_printf("timer_object create failure\r\n");
	// }
	// power_object=cmiot_object_init(3331,0,5805,1,"1",1,0,cmiot_value_float);
	// if(power_object==ZOS_NULL)
	// {
	// 	zos_printf("power_object create failure\r\n");
	// }
	cur_object=cmiot_object_init(3311,0,5805,1,"1",1,0,cmiot_value_float);
	if(power_object==ZOS_NULL)
	{
		zos_printf("cur_object create failure\r\n");
	}

	sum_object=cmiot_object_init(3331,0,5805,1,"1",1,0,cmiot_value_float);
	if(power_object==ZOS_NULL)
	{
		zos_printf("sum_object create failure\r\n");
	}

	// color_object=cmiot_object_init(3311,0,5706,1,"1",3,0,cmiot_value_string);
	// if(color_object==ZOS_NULL)
	// {
	// 	zos_printf("color_object create failure\r\n");
	// }
	if(nb_get_powenon_from_deepsleep() != ZOS_EOK)
	{
		if(cmiot_quick_start()!= ZOS_EOK)
		{
			zos_printf("onenet quick start failure\r\n");
			return ZOS_ERROR;
		}
		return ZOS_EOK;
	}


}


#include "shell.h"


int onenet_init(int argc, char *argv[])
{
	return demo_onenet();

}

SHELL_EXPORT_CMD(demo_onenet,demo_onenet, demo onenet);

int demo_notify(int argc, char *argv[])
{	
	// value_float +=1;
	return cmiot_notify_with_ack(sum_object,4,(cmiot_value_t)&value_float,0,0);

}

SHELL_EXPORT_CMD(demo_notify,demo_notify, onenet notify);

int demo_cmiot_del(int argc, char *argv[])
{
	return cmiot_close();
}

SHELL_EXPORT_CMD(demo_cmiot_del,demo_cmiot_del, onenet close);




#endif
